
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Arthur
 */
public class Recebedor extends Thread {

    private DefaultListModel modelListaMensagens = new DefaultListModel();
    private DefaultListModel modelListaUsuarios = new DefaultListModel();
    private Socket conexao;
    private String nickname;
    private Chat chat;
    private ChatPrivado chatPrivado;
    private ArrayList<ChatPrivado> listaChats = new ArrayList<ChatPrivado>();
    private Login login;
    private PrintStream saida;
    private JList listaMensagens;
    private Player player;
    private File file;
    private boolean checkboxSom;
    private int cont = 0;

    public Recebedor(Socket conexao, JList listaMensagens, DefaultListModel modelListaMensagens, DefaultListModel listaUsuarios, Chat chat, Login login, String nickname) throws IOException {
        this.modelListaMensagens = modelListaMensagens;
        this.listaMensagens = listaMensagens;
        this.modelListaUsuarios = listaUsuarios;
        this.conexao = conexao;
        this.chat = chat;
        this.login = login;
        this.nickname = nickname;
        saida = new PrintStream(conexao.getOutputStream());

    }

    public boolean isCheckboxSom() {
        return checkboxSom;
    }

    public void setCheckboxSom(boolean checkboxSom) {
        this.checkboxSom = checkboxSom;
    }

    public ArrayList<ChatPrivado> getListaChats() {
        return listaChats;
    }

    public void setListaChats(ArrayList<ChatPrivado> listaChats) {
        this.listaChats = listaChats;
        chat.setListaChats(listaChats);
    }

    public void run() {
        try {
            BufferedReader entrada = new BufferedReader(new InputStreamReader(this.conexao.getInputStream()));
            String msg;
            while (true) {
                msg = entrada.readLine().trim();
                if (msg == null) {
                    chat.setVisible(false);
                    login.setVisible(true);
                    JOptionPane.showMessageDialog(null, "Já existe um usuário conectado com esse nickname.");
                    break;
                } else {
                    if (msg.startsWith("1_")) {
                        String usuario = msg.substring(2, msg.length());
                        modelListaUsuarios.add(modelListaUsuarios.size(), usuario);
                        System.out.println("NOVO USUARIO: " + usuario);
                    } else if (msg.startsWith("2_")) {
                        String usuario = msg.substring(2, msg.length());
                        modelListaUsuarios.removeElement(usuario);
                        System.out.println("REMOVER USUARIO: " + usuario);
                    } else if (msg.startsWith("3_")) {
                        //String dados[] = msg.split(":");
                        msg = msg.substring(2, msg.length()).toUpperCase();
                        int answer = JOptionPane.showConfirmDialog(null, msg + " deseja iniciar uma conversa privada com você. Aceitar?");
                        if (answer == JOptionPane.YES_OPTION) {
                            saida.println("5_" + nickname + "&" + msg);
                            chatPrivado = new ChatPrivado(conexao, msg, nickname, this);
                            chatPrivado.setNickname(msg.toUpperCase());
                            chatPrivado.setLocationRelativeTo(null);
                            chatPrivado.setVisible(true);
                            listaChats.add(chatPrivado);
                            chat.setListaChats(listaChats);
                        } else {
                            modelListaMensagens.add(modelListaMensagens.size(), "Você recusou o convite de " + msg + " para uma conversa privada.");
                            saida.println("4_Seu convite para iniciar uma conversa privada com " + nickname.toUpperCase() + " foi recusado&" + msg);
                        }

                    } else if (msg.startsWith("5_")) {
                        chatPrivado = new ChatPrivado(conexao, msg.substring(2, msg.length()).toUpperCase(), nickname, this);
                        chatPrivado.setNickname(msg.substring(2, msg.length()).toUpperCase());
                        chatPrivado.setLocationRelativeTo(null);
                        chatPrivado.setVisible(true);
                        listaChats.add(chatPrivado);
                        chat.setListaChats(listaChats);
                        ArrayList<String> listaConvites = chat.getListaConvites();
                        listaConvites.remove(msg.substring(2, msg.length()).toUpperCase());
                        chat.setListaConvites(listaConvites);
                    } else if (msg.startsWith("6_")) {
                        String s[] = msg.split(" ");
                        String nome = s[0].substring(2, s[0].length());
                        for (ChatPrivado listaChat : listaChats) {
                            if (listaChat.getNickname().equals(nome)) {
                                chatPrivado = listaChat;
                            }
                        }
                        if (s[2].equals("%")) {
                            JOptionPane.showMessageDialog(null, nome + " saiu da conversa privada.");
                            chatPrivado.dispose();
                            listaChats.remove(chatPrivado);
                            chat.setListaChats(listaChats);
                        } else {
                            chatPrivado.adicionarMensagemPrivada(msg.substring(2, msg.length()), nome);
                            chatPrivado.toFront();
                        }
                    } else if (msg.startsWith("7_")) {
                        //Convite recusado
                        ArrayList<String> listaConvites = chat.getListaConvites();
                        String nome[] = msg.substring(2, msg.length()).split(" ");
                        listaConvites.remove(nome[8]);
                        chat.setListaConvites(listaConvites);
                    } else {
                        modelListaMensagens.add(modelListaMensagens.size(), horaAtual() + msg);
                        listaMensagens.ensureIndexIsVisible(listaMensagens.getModel().getSize() - 1);
                        chat.toFront();
                        play();
                    }
                }
            }
        } catch (IOException e) {
            chat.dispose();
            for (ChatPrivado listaChat : listaChats) {
                listaChat.dispose();
            }
            int answer = JOptionPane.showConfirmDialog(null, "A conexão com o servidor foi perdida. Tentar reconectar?");
            if (answer == JOptionPane.YES_OPTION) {
                BarraProgresso barra = new BarraProgresso(nickname, modelListaMensagens);
            } else {
                System.exit(0);
            }
        }
    }

    public void play() {
        if (!checkboxSom) {
            try {
                this.file = new File("bip.mp3");
                FileInputStream fis = new FileInputStream(file);
                BufferedInputStream bis = new BufferedInputStream(fis);
                this.player = new Player(bis);
                this.player.play();
            } catch (FileNotFoundException | JavaLayerException e) {
                System.out.println("Problema ao tocar ");
            }
        }
    }

    public String horaAtual() {
        String formatoHora = "HH:mm:ss";
        Date agora = new Date();
        SimpleDateFormat formata = new SimpleDateFormat(formatoHora);
        return "[" + formata.format(agora) + "] ";
    }
}
